5310
6325
Ich liste die Kontakte des Webdienstes auf und zeige sie in der Tabellenansicht mit den Abschnitten "Kontakte" an, wie im Screenshot dargestellt.
Das Problem ist, dass ich dieselben Tag-Werte für Kontrollkästchen der ersten Zeile für Abschnitt A sowie für Abschnitt S erhalte. Ich habe ein Array sortiert und in der indizierten Tabellenansicht angezeigt. So erhalten Sie je nach indexPath.row unterschiedliche Tag-Werte, unabhängig von der Anzahl der angezeigten Abschnitte. Folgendes habe ich versucht
In cellForRowAtIndexPath:
UIButton * checkBox;
if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone)
{
checkBox = [[UIButton-Zuweisung] initWithFrame: CGRectMake (7, 8, 30, 30)];
}}
sonst
{
checkBox = [[UIButton-Zuweisung] initWithFrame: CGRectMake (15, 13, 30, 30)];
}}
// int cnt = 0;
// für (int i = indexPath.section - 1; i> 0; i--)
// {
// cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters hat Zeichen 'A' bis 'Z'
//}
//checkBox.tag = cnt + indexPath.row;
[checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] für Status: UIControlStateNormal];
[checkBox addTarget: self action: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
Rückgabezelle;
}}
- (void) checkBoxClicked: (id) Absender
{
CGPoint buttonPosition = [Absender convertPoint: CGPointZero toView: self.tableViewContact];
NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition];
UIButton * tappedButton = (UIButton *) Absender;
NSLog (@ "Tag-Nummer =% d", [Absender-Tag]);
if ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]])
{
[Absender setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal];
if (indexPath! = Nil)
{
NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // Kontrollkästchen-IDs in mutableArrayOfIds speichern
NSLog (@ "Tagged Checked Button ID =% @", finalIntId);
[arrayOfIds addObject: finalIntId];
}}
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag];
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row];
}}
sonst
{
[sender setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
NSLog (@ "UnChecked");
// [arrayOfIds removeObjectAtIndex: tappedButton.tag];
}}
}}
- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) section {
if ([arrayOfCharacters count] == ​​0)
{
Rückkehr @"";
}}
return [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: section]];
}}
- (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView
{
NSArray * toBeReturned = [NSArray arrayWithArray:
[@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X. | Y | Z | # "
componentsSeparatedByString: @ "|"]];
return toBeReturned;
}}
- (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index
{
NSInteger count = 0;
for (NSString * -Zeichen in arrayOfCharacters) {
if ([Zeichen isEqualToString: title]) {
Rückgabezahl;
}}
count ++;
}}
return 0;
}}
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
return [arrayOfCharacters count];
// return 1;
}}
- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) Abschnitt
{
// return [mutableArray count];
return [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count];
}} 
Sie legen für alle Abschnitte mit derselben Zeile den gleichen Tag-Wert fest.
Der indexPath hat zwei Eigenschaften: {section, row}.
Nehmen wir an, Abschnitt A hat zwei Zeilen.
für row1 -> indexPath.section = 0, indexPath.row = 0;
für row2-> indexPath.section = 0, indexPath.row = 1;
Nehmen wir an, Abschnitt S hat zwei Zeilen.
für row1 -> indexPath.section = 1, indexPath.row = 0;
für row2-> indexPath.section = 1, indexPath.row = 1;
Für Zeile 1 von Abschnitt A und Zeile 1 von Abschnitt S setzen Sie denselben Tag-Wert wie 0. Es liegt Ihr Problem vor.
Versuchen Sie, den Tag-Wert wie unten einzustellen.
button.tag = indexPath.section * 1000 + indexPath.row;
beim Abrufen des Abschnitts und der Zeile
NSInteger section = (button.tag) / 1000;
NSInteger row = (button.tag)% 1000;
|
Versuche dies...
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
statischer NSString * CellIdentifier = @ "Cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell-Zuweisung] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier];
}}
UIButton * checkBox = [[UIButton-Zuweisung] initWithFrame: CGRectMake (280, 10, 50, 44)];
checkBox.backgroundColor = [UIColor orangeColor];
[checkBox addTarget: self action: @selector (checkBoxClicked: event :) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
Rückgabezelle;
}}
- (void) checkBoxClicked: (id) Absenderereignis: (id) Ereignis
{
NSSet * touch = [event allTouches];
UITouch * touch = [berührt ein beliebiges Objekt];
CGPoint currentTouchPosition = [touch locationInView: self.tv]; // hier ist tv TableView Object
NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition];
NSLog (@ "Wert von indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row);
}}
|
Dies geschieht, weil Sie den Schaltflächen UNABHÄNGIG von Abschnitten ein Tag zuweisen.
Beide der ersten Abschnittsreihen A & S haben Zeile = 0. Das Tag, das der jeweiligen Schaltfläche zugewiesen ist, ist also 0. Sie sollten sie zuweisen und dabei auf Ihre Abschnitte verweisen.
Ich würde vorschlagen, einen Hinweis auf Barrierefreiheit mit einem durch Kommas getrennten Formular zuzuweisen, das Abschnitt, Zeile enthält.
Und in deiner Methode
- (void) checkBoxClicked: (id) Absender
{
// Zeichenfolge aus einem durch Kommas getrennten Formular auswählen. 1. ist dein Abschnitt, 2. ist Reihe.
}}
Die zweite Option ist, was auch immer Sie tun, und implementieren Sie Ihre Button-Methode wie folgt.
CGPoint buttonPosition = [Absender convertPoint: CGPointZero toView: self.tableView];
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition];
if (indexPath! = nil)
{
... indexpath.section ist Ihr Abschnitt, index path.row ist Ihre Zeile.
}}
Es gibt auch die dritte Option.
Weisen Sie in cellforRowAtIndexpath Ihrem Button einen Titel zu
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
[btn setTitle: <# Your Row #> forState: UIControlStateDisabled];
[btn setTag <#Ihr Abschnitt #>];
Nach dem Empfang in Ihrer Schaltflächenmethode können Sie also sowohl Abschnitt (Tag) als auch Zeile (Titel für deaktivierten Status) haben.
- (void) checkBoxClicked: (id) sender {[button titleForState: UIControlStateDisabled]; // deine Reihe
button.tag // dein Abschnitt}
|
Versuche dies!
In jedem Abschnitt kennen Sie möglicherweise die Anzahl der Abschnitte rechts und fügen dann die Anzahl der einzelnen Zeilen hinzu.
[[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row
Dabei ist fieldTitlesList das Array Ihrer Abschnitte.
|
Ich habe den folgenden Code hinzugefügt, der mein Problem gelöst hat
NSInteger rowNumber = 0;
für (NSInteger i = 0; i